<?php

namespace app\index\controller\job;
use think\Db;
use think\Log;
use think\queue\Job;
class TestQueue
{
    // 消费者执行入口
    public function fire(Job $job, $data)
    {
        // 有些消息在到达消费者时,可能已经不再需要执行了
        $isJobStillNeedToBeDone = $this->check($data);
        if($isJobStillNeedToBeDone){
            $job->delete();  //删除任务
            return;
        }
        // 具体执行业务
        $isJobDone = $this->doJob($data);

        if ($isJobDone) {
            // 消息队列执行成功，删除队列，否则会一直执行
            $job->delete();
        } else {
            // 消息队列执行失败
            // 获取消息队列已经重试了几遍
            $attempts = $job->attempts();
            if ($attempts == 0 || $attempts == 1) {
                // 重新发布，参数 delay 是延时发布的时间
                $job->release(2);
            }
        }
    }

    // 消息队列执行失败后会自动执行该方法
    public function failed($data)
    {
        Log::error('消息队列达到最大重复执行次数后失败：' . json_encode($data,JSON_UNESCAPED_UNICODE));
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    public function check($data){
        // 如果已经存在，不需要执行
        $datasy = Db::table('user_age')->where('age',$data['age'])->find();
        if($datasy)
        {
            return true;
        }else{
            return false;
        }
    }

    // 消息队列执行方法
    public function doJob($data)
    {
        // 具体执行业务 //追加数据
        $result = Db::table('user_age')->insert($data);

        if($result === FALSE)
        {
            echo "执行失败";
            return false;
        }else{
            echo "执行成功".$data['age'];
            return true;
        }
    }
}